﻿/***  File Header  ************************************************************/
/**
* @file DicSH4A.cpp
*
* SH4A ワード
* @author	shozo fukuda
* @date		作成 Thu Feb 23 15:17:07 2006
* @date		修正 $Date: 06/04/13 14:26 $
* System	SH4 <br>
*
*******************************************************************************/

/*******************************************************************************
* IMPORTS:
*******************************************************************************/
#include <string.h>
#include "sh7780.h"
#include "Dic.h"	/* 呼出用 */

/*******************************************************************************
* CONSTANT:
*******************************************************************************/

/*******************************************************************************
* TYPE:
*******************************************************************************/

/*******************************************************************************
* MACRO:
*******************************************************************************/

/*******************************************************************************
* GLOBAL VARIABLE:
*******************************************************************************/

/***  Module Header  ******************************************************}}}*/
/**
* FORTHワード B@ ( addr -- data )
* @par 解説
*   ロード
*
* @par forth CODE B@ f_8_fetch END-CODE
**/
/**************************************************************************{{{*/
void f_8_fetch(
P4th* p4th)
{
	char* addr = (char*)POP();
	PUSH(*addr);
}

/***  Module Header  ******************************************************}}}*/
/**
* FORTHワード B!
* @par 解説
*   <<解説記入>>
*
* @par forth CODE B! f_8_store END-CODE
**/
/**************************************************************************{{{*/
void f_8_store(
P4th* p4th)
{
	char* addr = (char*)POP();
	*addr = POP();
}

/***  Module Header  ******************************************************}}}*/
/**
* FORTHワード W@
* @par 解説
*   <<解説記入>>
*
* @par forth CODE W@ f_16_fetch END-CODE
**/
/**************************************************************************{{{*/
void f_16_fetch(
P4th* p4th)
{
	short* addr = (short*)POP();
	PUSH(*addr);
}

/***  Module Header  ******************************************************}}}*/
/**
* FORTHワード W!
* @par 解説
*   <<解説記入>>
*
* @par forth CODE W! f_16_store END-CODE
**/
/**************************************************************************{{{*/
void f_16_store(
P4th* p4th)
{
	short* addr = (short*)POP();
	*addr = POP();
}

/***  Module Header  ******************************************************}}}*/
/**
* FORTHワード L@
* @par 解説
*   <<解説記入>>
*
* @par forth CODE L@ f_32_fetch END-CODE
**/
/**************************************************************************{{{*/
void f_32_fetch(
P4th* p4th)
{
	long* addr = (long*)POP();
	PUSH(*addr);
}

/***  Module Header  ******************************************************}}}*/
/**
* FORTHワード L!
* @par 解説
*   <<解説記入>>
*
* @par forth CODE L! f_32_store END-CODE
**/
/**************************************************************************{{{*/
void f_32_store(
P4th* p4th)
{
	long* addr = (long*)POP();
	*addr = POP();
}

/***  Module Header  ******************************************************}}}*/
/**
* FORTHワード FILL ( addr len data -- )
* @par 解説
*   <<解説記入>>
*
* @par forth CODE FILL f_fill END-CODE
**/
/**************************************************************************{{{*/
void f_fill(
P4th* p4th)
{
	char  data = POP();
	long  len  = POP();
	char* addr = (char*)POP();

	memset(addr, data, len);
}

/***  Module Header  ******************************************************}}}*/
/**
* FORTHワード CMOVE	( from to len -- )
* @par 解説
*   <<解説記入>>
*
* @par forth CODE CMOVE f_cmove END-CODE
**/
/**************************************************************************{{{*/
void f_cmove(
P4th* p4th)
{
	long  len  = POP();
	char* to   = (char*)POP();
	char* from = (char*)POP();

	memmove(from, to, len);
}

/***  Module Header  ******************************************************}}}*/
/**
* FORTHワード PCIBUS	( dev func -- )
* @par 解説
*   指定のPCIコンフィグレーションアドレスのベンダ/デバイス/リビジョンIDを印字しま
*   す。指定のアドレスにデバイスが見つからない場合は何も印字しません。
*
* @par forth CODE PCIBUS f_pcibus END-CODE
**/
/**************************************************************************{{{*/
void f_pcibus(
P4th* p4th)
{
	HwPCI* pci = SH7780_PCIC::Instance();

	long fun  = POP();
	long dev  = POP();
	ADDR conf = pci->ConfAddr(0, dev, fun);

	ULONG vid, did, rev;	
	vid = pci->PeekConfW(conf, PCI_VENDOR_ID);
	if (vid != 0xFFFF) {
		did = pci->PeekConfW(conf, PCI_DEVICE_ID);  
		rev = pci->PeekConfB(conf, PCI_REV_ID);
		p4th->Printf("BUS=%d, DEV=%02d, FUN=%d, VID=%04X, DID=%04X, REV=%02X\n", 0, dev, fun, vid, did, rev);   
	}
}

/***  Module Header  ******************************************************}}}*/
/**
* FORTHワード PCICONF	( id unit -- )
* @par 解説
*   PCIコンフィグレーションレジスタを表示します。
*
* @par forth CODE PCICONF f_pciconf END-CODE
**/
/**************************************************************************{{{*/
void f_pciconf(
P4th* p4th)
{
	long unit = POP();
	long id   = POP();

	long ven  = 0xFFFF & (id);
	long dev  = 0xFFFF & (id >> 16);

	PCIConf conf;
	SH7780_PCIC::Instance()->SeeConfig(ven, dev, unit, &conf);
	
	p4th->Printf("Vendor ID     : %04X\n", conf.mVen);
	p4th->Printf("Device ID     : %04X\n", conf.mDev);
	p4th->Printf("Command       : %04X\n", conf.mCmd);
	p4th->Printf("Status        : %04X\n", conf.mStatus);
	p4th->Printf("Base Address0 : %04X\n", conf.mBase[0]);
}

/***  Module Header  ******************************************************}}}*/
/**
* FORTHワード YMSEND ( size addr -- )
* @par 解説
*   YMODEM送信を行ないます。
*
* @par forth CODE YMSEND f_ymsend END-CODE
**/
/**************************************************************************{{{*/
void f_ymsend(
P4th* p4th)
{
	long addr = POP();
	long size = POP();
	
	HwSIO* sio1 = SH7780_SCIF::Instance(1);

	sio1->PutYMODEM((char*)addr, size, "P9RC.bin");	
}

/***  Module Header  ******************************************************}}}*/
/**
* FORTHワード YMSEND ( size addr -- )
* @par 解説
*   YMODEM受信を行ないます。
*
* @par forth CODE YMRECEIVE f_ymreceive END-CODE
**/
/**************************************************************************{{{*/
void f_ymreceive(
P4th* p4th)
{
	long addr = POP();
	long size;
	char fname[32];
	
	HwSIO* sio1 = SH7780_SCIF::Instance(1);

	sio1->GetYMODEM((char*)addr, size, fname);	
}

/***  Module Header  ******************************************************}}}*/
/**
* SH4/SH4A定数テーブル
* @par 解説
*   SH4/SH4A固有の定数
**/
/**************************************************************************{{{*/
P4thConst ConstSH4[] = {
#if 1
	0xff800008, "&DDRIF",
	0xff800008, ".MIM",
	0xff800010, ".SCR",
	0xff800018, ".STR",
	0xff800030, ".SDR",
	
	0xff400020, "&MMSELR",

	//
	0xff801000, "&LBSC",
	0xff801000, ".BCR",
	0xff802000, ".CS0BCR",
	0xff802010, ".CS1BCR",
	0xff802020, ".CS2BCR",
	0xff802040, ".CS4BCR",
	0xff802050, ".CS5BCR",
	0xff802060, ".CS6BCR",
	0xff802008, ".CS0WCR",
	0xff802018, ".CS1WCR",
	0xff802028, ".CS2WCR",
	0xff802048, ".CS4WCR",
	0xff802058, ".CS5WCR",
	0xff802068, ".CS6WCR",
	0xff802070, ".CS5PCR",
	0xff802080, ".CS6PCR",
	
	0xffe00000, "&SCIF",
	0xffe00000, ".SCSMR0",
	0xffe00004, ".SCBRR0",
	0xffe00008, ".SCSCR0",
	0xffe0000c, ".SCFTDR0",
	0xffe00010, ".SCFSR0",
	0xffe00014, ".SCFRDR0",
	0xffe00018, ".SCFCR0",
	0xffe0001c, ".SCTFDR0",
	0xffe00020, ".SCRFDR0",
	0xffe00024, ".SCSPTR0",
	0xffe00028, ".SCLSR0",
	0xffe0002c, ".SCRER0",

	0xffe10000, ".SCSMR1",
	0xffe10004, ".SCBRR1",
	0xffe10008, ".SCSCR1",
	0xffe1000c, ".SCFTDR1",
	0xffe10010, ".SCFSR1",
	0xffe10014, ".SCFRDR1",
	0xffe10018, ".SCFCR1",
	0xffe1001c, ".SCTFDR1",
	0xffe10020, ".SCRFDR1",
	0xffe10024, ".SCSPTR1",
	0xffe10028, ".SCLSR1",
	0xffe1002c, ".SCRER1",
#endif
	
	0,0	/* ターミネータ */
};

/* end of DicSH4A.cpp */

